//! 配置加载器trait定义
//! 
//! 支持多种配置文件格式的统一接口

use crate::cluster::ClusterConfig;
use anyhow::Result;
use std::path::Path;

/// 配置加载器trait
/// 
/// 支持不同格式的配置文件加载，包括但不限于：
/// - Redis官方.conf格式
/// - TOML格式
/// - JSON格式（可扩展）
/// - YAML格式（可扩展）
pub trait ConfigLoader: Send + Sync {
    /// 从文件路径加载配置
    fn load_from_file(&self, path: &Path) -> Result<ClusterConfig>;
    
    /// 从字符串内容加载配置
    fn load_from_string(&self, content: &str) -> Result<ClusterConfig>;
    
    /// 获取支持的文件扩展名
    fn supported_extensions(&self) -> Vec<&'static str>;
    
    /// 获取加载器名称
    fn loader_name(&self) -> &'static str;
    
    /// 验证配置内容格式
    fn validate_format(&self, content: &str) -> bool;
}

/// 配置文件格式检测器
pub struct ConfigFormatDetector;

impl ConfigFormatDetector {
    /// 根据文件扩展名检测格式
    pub fn detect_by_extension<P: AsRef<Path>>(path: P) -> Option<ConfigFormat> {
        let path = path.as_ref();
        match path.extension()?.to_str()? {
            "conf" => Some(ConfigFormat::RedisConf),
            "toml" => Some(ConfigFormat::Toml),
            "json" => Some(ConfigFormat::Json),
            "yaml" | "yml" => Some(ConfigFormat::Yaml),
            _ => None,
        }
    }
    
    /// 根据文件内容检测格式
    pub fn detect_by_content(content: &str) -> ConfigFormat {
        let content = content.trim();
        
        // 检测TOML格式
        if content.contains("[") && content.contains("]") && content.contains("=") && 
           content.lines().any(|line| line.trim().starts_with("[") && line.trim().ends_with("]")) {
            return ConfigFormat::Toml;
        }
        
        // 检测JSON格式
        if content.starts_with('{') && content.ends_with('}') {
            return ConfigFormat::Json;
        }
        
        // 检测YAML格式
        if content.contains(":") && !content.contains("=") {
            return ConfigFormat::Yaml;
        }
        
        // 默认为Redis配置格式
        ConfigFormat::RedisConf
    }
}

/// 支持的配置文件格式
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum ConfigFormat {
    /// Redis官方.conf格式
    RedisConf,
    /// TOML格式
    Toml,
    /// JSON格式
    Json,
    /// YAML格式
    Yaml,
}

impl ConfigFormat {
    /// 获取格式名称
    pub fn name(&self) -> &'static str {
        match self {
            ConfigFormat::RedisConf => "Redis Conf",
            ConfigFormat::Toml => "TOML",
            ConfigFormat::Json => "JSON", 
            ConfigFormat::Yaml => "YAML",
        }
    }
    
    /// 获取默认文件扩展名
    pub fn default_extension(&self) -> &'static str {
        match self {
            ConfigFormat::RedisConf => "conf",
            ConfigFormat::Toml => "toml",
            ConfigFormat::Json => "json",
            ConfigFormat::Yaml => "yaml",
        }
    }
}